package jdk.thread.newThead;

import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.Future;
import java.util.concurrent.FutureTask;

public class NewThreadTest {

    public static void main(String[] args) throws ExecutionException, InterruptedException {
        ThreadCreate();
        RunnableCreate();
        CallableCreate();
    }









    private static void ThreadCreate(){
        new Task().start();
    }




    static class Task extends Thread{
        @Override
        public void run() {
            System.out.println("继承Thread类创建线程类。。。");
        }
    }




    private static void RunnableCreate(){
        Thread t = new Thread(new Runnable() {
            @Override
            public void run() {
                System.out.println("通过Runnable接口创建线程类");
            }
        });
        t.start();
    }




    private static void CallableCreate() throws ExecutionException, InterruptedException {
        Callable<Integer> c = new Callable<Integer>() {
            @Override
            public Integer call() throws Exception {
                System.out.println("通过Callable和Future创建线程。。。");
                Thread.sleep(1000l);
                return 102324;
            }
        };

        FutureTask<Integer> ft = new FutureTask<>(c);
        ft.run();
        // FutureTask需要调用run()才会执行线程，FutureTask有继承Future和Runnable接口， Runnable有run()这个执行方法，
        // 而Future不能执行， 它只有get()这个获取执行结果的方法, get()会阻塞。
        System.out.println("FutureTask已点击执行！");
        System.out.println("Callable返回值: "+ft.get());


        /*
         *  FutureTask(Runnable runnable, V result)
         *  虽然也提供了Runnable使用的方法，FutureTask.get()就是传入的result,
         *  而不是在线程执行过程中产生的，因为Runnable的run()没有入参也没有返回，
         *  FutureTask就是用个Adapter, 把Runnable包装成一个Callable类，
         *  虽然Callable里也有result值，但run()不知情。
         */

    }


}
